//
//  ViewController.m
//  HKUtilities
//
//  Created by 胡锦涛 on 2018/10/24.
//  Copyright © 2018 胡锦涛. All rights reserved.
//

#import "ViewController.h"
#import "HKViewController.h"
#import "HKMacro.h"
#import "HKScaleCycleView.h"
#import "HKNetService.h"
#import "HKNetService+Config.h"
#import "HKWebViewController.h"
#import "HKMessageBox.h"
#import "HKPrefixHeader.h"
@interface ViewController ()<UITableViewDelegate,UITableViewDataSource>

/** 数据量 */
@property (nonatomic, assign) NSInteger dataCount;
/** tableView列表 */
@property (nonatomic, strong) UITableView * tableView ;

/** 上拉加载更多控件 */
@property (nonatomic, strong) UIView *footer;
/** 上拉加载更多控件里面的文字 */
@property (nonatomic, strong) UILabel *footerLabel;
/** 上拉加载更多控件时是否正在刷新 */
@property (nonatomic, assign, getter=isFooterRefreshing) BOOL footerRefreshing ;

/** 下拉刷新控件 */
@property (nonatomic, strong) UIView *header;
/** 下拉刷新控件里面的文字 */
@property (nonatomic, strong) UILabel *headerLabel;
/** 下拉加载更多控件时正在刷新 */
@property (nonatomic, assign, getter=isHeaderRefreshing) BOOL headerRefreshing ;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.dataCount = 3;
    self.navigationItem.title = @"自定义刷新控件";
    self.view.backgroundColor = kLightGrayColor;
    self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, HK_NAVBAR_HEIGHT, SCREEN_WIDTH, SCREEN_HEIGHT-HK_NAVBAR_HEIGHT) style:UITableViewStylePlain];
    [self.view addSubview:self.tableView];
    self.tableView.delegate = self;
    self.tableView.dataSource = self;
    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cell"];
    [self setupRefresh];
    self.tableView.scrollIndicatorInsets = self.tableView.contentInset;//设置滚动条的contentInset
    self.tableView.contentInset = UIEdgeInsetsMake(0, 0, HK_TABBAR_HEIGHT, 0);
    
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    //根据数据量设置footer是否显示(有数据显示，无数据隐藏)
    self.footer.hidden = (self.dataCount == 0);
    return self.dataCount;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
    cell.textLabel.text = [NSString stringWithFormat:@"自定义刷新控件-%ld",(long)indexPath.row];
    return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [self enterEvent];
}
- (void)setupRefresh {
    //FIXME:②界面编写
    //广告条
    UILabel * label = [UILabel new];
    label.backgroundColor = kBlackColor;
    label.textColor = kWhiteColor;
    label.text = @"广告";
    label.textAlignment = NSTextAlignmentCenter;
    label.frame = CGRectMake( 0, 0, 0, 30);
    self.tableView.tableHeaderView = label;

    //header
    UIView *header = [[UIView alloc] init];
    header.frame = CGRectMake(0, -50, self.tableView.width, 50);
    self.header = header;
    //FIXME:③增加控件
    [self.tableView addSubview:header];

    UILabel *headerLabel = [[UILabel alloc] init];
    headerLabel.frame = CGRectMake(0, 0, header.width, header.height);
    headerLabel.backgroundColor = kRedColor;
    headerLabel.text = @"下拉可以刷新";
    headerLabel.backgroundColor = kRedColor;
    headerLabel.textColor = kWhiteColor;
    headerLabel.textAlignment = NSTextAlignmentCenter;
    [header addSubview:headerLabel];
    self.headerLabel = headerLabel;
    //FIXME:不建议使用此属性
    //self.tableView.tableHeaderView = header;
    
    //footer
    self.footer = [[UIView alloc] init];
    self.footer.frame = CGRectMake(0, 0, self.tableView.width, 35);
    self.footerLabel = [[UILabel alloc] init];
    self.footerLabel.frame = CGRectMake(0, 0, self.footer.width, 35);
    self.footerLabel.backgroundColor = kRedColor;
    self.footerLabel.text = @"上拉可以加载更多";
    self.footerLabel.textColor = kWhiteColor;
    self.footerLabel.textAlignment = NSTextAlignmentCenter;
    [self.footer addSubview:self.footerLabel];
    self.tableView.tableFooterView = self.footer;
}

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return 35;
}

#pragma mark---------代理方法------
/** 用户松开scrollView时调用 */
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
    
    //如果正在下拉刷新，直接返回
    if (self.isHeaderRefreshing) return;
    
    //当scrollView的偏移量y值 >= offsetY时，代表header已经完全出现
    CGFloat offsetY = -(self.tableView.contentInset.top + self.header.height);
    if (self.tableView.contentOffset.y <= offsetY) {
        //header开始刷新
        //FIXME:⑤封装代码
        [self headerBeginRefreshing];
    }
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    
    //处理Header
    [self dealHeader];
    
    //处理Footer
    [self dealFooter];
}

/** 处理Hooter */
- (void)dealHeader {
    
    
    //如果正在下拉刷新，直接返回
    if (self.isHeaderRefreshing) return;
    //FIXME:④切换状态
    //当scrollView的偏移量y值 >= offsetY时，代表footer已经完全出现
    CGFloat offsetY = -(self.tableView.contentInset.top + self.header.height);
    if (self.tableView.contentOffset.y <= offsetY) {
        //header已经完全出现
        self.headerLabel.text = @"松开立即刷新";
        self.headerLabel.backgroundColor = kGrayColor;
    }else {
        self.headerLabel.text = @"下拉可以刷新";
        self.headerLabel.backgroundColor = kRedColor;
    }
}
/** 处理footer */
- (void)dealFooter{
    //如果没有内容，则不需要执行这个操作
    if (self.tableView.contentSize.height == 0) return;
    //如果正在刷新，直接返回
    if (self.isFooterRefreshing) return;
    
    //FIXME:①偏移量判断
    //当scrollView的偏移量y值 >= offsetY时，代表footer已经完全出现
    //A.footer 完全出现时的偏移量
    //scrollView.contentOffset.y = 内容高度+底部内边距-frame高度
    //CGFloat ofsetY = self.tableView.contentSize.height + self.tableView.contentInset.bottom;
    //B.假设出现一半的时候修改状态，变为正在加载中...
    // CGFloat ofsetY = self.tableView.contentSize.height + self.tableView.contentInset.bottom - self.tableView.height-self.tableView.tableFooterView.height/2;
    //C.刚出现就修改状态
    CGFloat ofsetY = self.tableView.contentSize.height + self.tableView.contentInset.bottom - self.tableView.height-self.tableView.tableFooterView.height;
    if (self.tableView.contentOffset.y >= ofsetY && self.tableView.contentOffset.y > -(self.tableView.contentInset.top)) {
        //footer已经完全出现，并且是往下拖拽
        //进入刷新状态
        //FIXME:⑤封装代码
        [self footerBeginRefreshing];
    }
}

#pragma mark - header
- (void)headerBeginRefreshing  {
    
    //如果正在刷新，直接返回
    if (self.isHeaderRefreshing) return;
    
    //header已经完全出现
    self.headerLabel.text = @"正在刷新数据...";
    self.headerLabel.backgroundColor = kBlueColor;
    self.headerRefreshing = YES;
    //增加内边距
    [UIView animateWithDuration:0.25 animations:^{
        UIEdgeInsets inset = self.tableView.contentInset;
        inset.top += self.header.height;
        self.tableView.contentInset = inset;
        //FIXME:⑥自动刷新和重复刷新
        //修改偏移量(稳住刷新状态)
        self.tableView.contentOffset = CGPointMake(self.tableView.contentOffset.x, - inset.top);
    }];
    
    HKLog(@"发送请求给服务器。下拉刷新数据");
    //发送请求给服务器。下拉刷新数据
    [self loadNewData];
}
- (void)headerEndRefreshing {
    self.headerRefreshing = NO;
    //减小内边距
    [UIView animateWithDuration:0.25 animations:^{
        UIEdgeInsets inset = self.tableView.contentInset;
        inset.top -= self.header.height;
        self.tableView.contentInset = inset;
    }];
    //self.headerLabel.text = @"下拉可以刷新";
    //self.headerLabel.backgroundColor = kRedColor;
}

#pragma mark - footer

- (void)footerBeginRefreshing {
    
    //如果正在刷新，直接返回
    if (self.isFooterRefreshing) return;//保证同一时间只执行一次
    
    //进入刷新状态
    self.footerRefreshing = YES;
    self.footerLabel.text = @"正在加载更多数据...";
    self.footerLabel.backgroundColor = kBlueColor;
    
    //发送请求给服务器-加载更多数据
    HKLog(@"发送请求给服务器-加载更多数据");
    [self loadMoreData];
}

- (void)footerEndRefreshing
{
    self.footerRefreshing = NO;
    self.footerLabel.text = @"上拉可以加载更多";
    self.footerLabel.backgroundColor = kRedColor;
}

#pragma mark - 数据处理
/** 发送请求给服务器。下拉刷新数据 */
- (void)loadNewData {
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        //服务器的数据回来了
        self.dataCount = 3;
        [self.tableView reloadData];
        //结束刷新
        [self headerEndRefreshing];
    });
}
/** 发送请求给服务器-加载更多数据 */
- (void)loadMoreData {
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        //服务器请求回来
        self.dataCount +=5;
        [self.tableView reloadData];
        //结束刷新
        [self footerEndRefreshing];
    });
}

- (void)enterEvent {
    HKViewController * vc = [HKViewController new];
    [self.navigationController pushViewController:vc animated:YES];
}
@end
